package app.sevenc.lib_framework.mvvm.vm

import androidx.lifecycle.ViewModel

/**
 * ViewModel的目标
 * 1.让状态管理独立于视图控制器，从而做到重建状态的分治、状态在多页面的共享，以及跨页面通信。
 * 2.为状态设置作用域，使状态的共享做到作用域可控。
 * 3.实现单向依赖，避免内存泄漏。
 * ViewModel无需实现DefaultLifecycleObserver接口绑定页面的生命周期,
 * Activity和Fragment，是作为ViewModelStoreOwner的实现，每个ViewModelStoreOwner持有着唯一的一个ViewModelStore，也即每个视图控制器都持有自己的一个ViewModelStore
 * ViewModelStore 的作用是维护一个 Map，来管理视图控制器所持有的所有 ViewModel(ViewModelStoreOwner 持有 ViewModelStore 持有 ViewModel)
 * 当作为 ViewModelStoreOwner 的视图控制器被 destory 时（重建的情况除外），ViewModelStore 会被通知去完成清除状态操作，从而将 Map 中管理着的 ViewModel 全部走一遍 clear 方法，并且清空 Map
 * See the [androidx.lifecycle.ViewModelProvider.get]
 *
 * 不建议在ViewModel中写业务逻辑的理由是
 * ViewModel的生命周期是跟随ViewModelStoreOwner的，Owner一旦destoryed，那么ViewModel也会走 clear，而触发 onClear。
 * 如果你在onClear中手动置空了业务变量，而业务方法此时又在执行中，那么就容易造成空指针异常。
 * 业务逻辑应该放在具体的数据组件中写，例如DataRepository，作为基础数据组件，既持有了httpManager，又持有了dbManager，各种缓存策略，以最合适的方式拿到前台 UI 想要的状态数据。
 * 在数据组件中处理业务逻辑，通过唯一可信源，以数据驱动的方式来统一将状态分发给前台UI，于是当前台UI健在，就会接受数据、响应 UI 逻辑，否则就会因LifeCycler的加持，而不至于让数据接触到空的视图引用、造成不可预期的错误
 *
 * 当 viewModelScope 被清除 (当 onCleared() 回调被调用时) 之后，它将自动取消它所启动的所有协程
 *
 * @author Seven-C
 * @date 2021/8/18
 */
open class BaseFrameViewModel : ViewModel() {

}